Skip to content

feat(birthday): fiche d'anniversaire en Components V2 - #398

Merged
AntoineJT merged 2 commits into
masterfrom
feat/birthday-own-sheet
Nov 10, 2026
Merged

AntoineJT merged 2 commits into
masterfrom
feat/birthday-own-sheet

Conversation

@AntoineJT

@AntoineJT AntoineJT commented Nov 10, 2026 •

Copy link
Copy Markdown
Member

🇫🇷 Français

🎯 Résumé

/birthday set et /birthday show répondent par une même fiche encadrée à la couleur du module (Components V2). Elle contient la date et le salon d'annonce, avec le bouton d'annonce juste à côté, puis les jumeaux d'anniversaire et, en petit, ce qui est conservé. /birthday upcoming passe dans le même cadre.

🤔 Motivation

Un membre a fait remarquer que ces réponses gagneraient à être mises en forme : c'étaient quatre lignes de texte brut, avec le bouton tout en bas. Une fiche se lit d'un coup d'œil, et le bouton se trouve à côté de ce qu'il change.

📦 Contenu

  • ✨ Fiche commune à set (« Anniversaire enregistré ») et show (« Votre anniversaire ») :
    • le salon d'annonce est nommé dans les deux cas (« Annoncé dans #… », « Non annoncé : compte seulement dans /birthday stats », ou « Sera annoncé dès qu'un salon d'annonces sera défini ») ;
    • la ligne sur les données conservées cite aussi le choix d'annonce.
  • 🔘 Le bouton d'annonce modifie la fiche sans en changer le titre : celui-ci voyage dans l'identifiant du bouton. Il vide aussi le texte des réponses envoyées avant le déploiement, sans quoi Discord refuserait la modification.
  • 📋 /birthday upcoming est encadré, y compris quand aucun anniversaire n'approche. La limite passe de 2 000 à 4 000 caractères, donc environ deux fois plus d'anniversaires sont listés avant le « … et N autres ».
  • 🔧 Plusieurs éléments sont désormais partagés :
    • sheetNotice(...textes) pour tout message encadré du module ;
    • ACCENT_COLOR dans rendering/theme.ts ;
    • COMPONENTS_TEXT_LIMIT exporté par #lib/format.ts.
  • 🐛 Correctif à part (commit fix(message-quote, starboard)), avant la fiche : un message Components V2 n'a ni contenu ni pièce jointe propre, donc sa citation affichait « Message sans texte » et son repost au starboard n'avait que l'en-tête. La réponse publique de /birthday upcoming en aurait souffert. Les deux modules lisent désormais le texte et les images de ses composants (#lib/message-content.ts), spoilers et messages transférés compris.
  • 🧪 messageText dans #lib/testing.ts lit le texte d'un message en Components V2.
  • 📝 docs/functional.md décrit la fiche, ses trois états d'annonce et le nouveau cadre d'upcoming.
  • ✅ Validation :
    • les tests vérifient le drapeau IsComponentsV2 et l'absence de content pour set, show et upcoming, ainsi que le titre conservé et le texte vidé par le bouton ;
    • 2 240 tests sur 2 240, build, oxlint, oxfmt et build de la doc OK ;
    • deux passes de revue corrective.

🧭 À noter

  • 🔕 Les notifications ne changent pas : toutes les réponses gardent allowedMentions vide. Vérifié sur Discord, le champ mentions des messages de démo est vide.
  • 🖼️ Avant/après validé sur le serveur de test : voir les rendus ci-dessous.
  • 🔭 À part : un horodatage relatif de Discord (<t:…:R>) dans upcoming, pour que « dans 3 jours » reste juste quand le message est relu plus tard (suggestion d'un membre).

🇬🇧 English

🎯 Summary

/birthday set and /birthday show now answer with the same sheet, framed in the module colour (Components V2). It shows the date and the announcement channel, with the announce button right beside them, then the birthday twins and, in small print, what is stored. /birthday upcoming moves into the same frame.

🤔 Motivation

A member pointed out that these replies deserved some layout: they were four lines of plain text with the button at the very bottom. A sheet reads at a glance, and the button sits next to what it changes.

📦 What's included

  • ✨ One sheet shared by set ("Birthday saved") and show ("Your birthday"):
    • both name the announcement channel ("Announced in #…", "Not announced: only counted in /birthday stats", or "Will be announced once an announcement channel is set");
    • the stored-data line also mentions the announcement choice.
  • 🔘 The announce button updates the sheet without changing its title, which travels in the button's custom ID. It also clears the text of replies sent before the deploy, without which Discord would reject the edit.
  • 📋 /birthday upcoming is framed, including when no birthday is coming up. The limit goes from 2,000 to 4,000 characters, so about twice as many birthdays are listed before the "… and N more".
  • 🔧 Several pieces are now shared:
    • sheetNotice(...texts) for any framed message in the module;
    • ACCENT_COLOR in rendering/theme.ts;
    • COMPONENTS_TEXT_LIMIT exported from #lib/format.ts.
  • 🐛 Separate fix (fix(message-quote, starboard) commit), before the sheet: a Components V2 message has no content or attachments of its own, so its quote showed "Message without text" and its starboard repost only had the header. The public /birthday upcoming reply would have suffered from it. Both modules now read the text and images of its components (#lib/message-content.ts), spoilers and forwarded messages included.
  • 🧪 messageText in #lib/testing.ts reads the text of a Components V2 message.
  • 📝 docs/functional.md describes the sheet, its three announcement states and the new upcoming frame.
  • ✅ Validation:
    • the tests check the IsComponentsV2 flag and the absence of content for set, show and upcoming, plus the title kept and the text cleared by the button;
    • 2,240/2,240 tests, build, oxlint, oxfmt and the docs build pass;
    • two corrective review passes.

🧭 Notes

  • 🔕 Notifications are unchanged: every reply keeps an empty allowedMentions. Checked on Discord: the mentions field of the demo messages is empty.
  • 🖼️ Before/after approved on the test server: see the renders below.
  • 🔭 Separately: a Discord relative timestamp (<t:…:R>) in upcoming, so that "in 3 days" stays right when the message is read later (a member's suggestion).

🖼️ Avant / après — Before / after

-# 🇫🇷 Exemples de rendus dessinés d'après les textes réels du module (thème sombre de Discord), pas des captures du client. / 🇬🇧 Example renders drawn from the module's real texts (Discord dark theme), not client screenshots.

/birthday set — avant / before après / after
/birthday set avant /birthday set après
/birthday show (non annoncé / not announced) — avant / before après / after
/birthday show avant /birthday show après
/birthday upcoming — avant / before après / after
/birthday upcoming avant /birthday upcoming après

📋 Checklist

  • 🇫🇷 Après déploiement, cliquer le bouton sur une fiche set et une fiche show / 🇬🇧 After deploying, click the button on a set sheet and a show sheet

Autofix with [code]smith
Open in [code]smith · Need help on this PR? Tag @codesmith-bot with what you need.

@AntoineJT AntoineJT added type: module Add a new module or edit an existing one scope: enhancement Enhance an existing feature labels Nov 10, 2026
@AntoineJT
AntoineJT force-pushed the feat/birthday-own-sheet branch from 766c179 to e840b3b Compare November 10, 2026 02:52
@AntoineJT
AntoineJT added this pull request to stack #405 November 10, 2026 03:42
…sage Components V2

Un message mis en page avec des composants n'a pas de contenu, et ses
fichiers ne s'affichent qu'à travers ses composants : sa citation
affichait « Message sans texte » et son repost au starboard n'avait que
l'en-tête. Les deux lisent désormais ses affichages de texte et ses
galeries (#lib/message-content.ts), message transféré compris, ce qui
vaut pour les réponses du bot comme pour les messages d'autres apps.

Les spoilers posés sur un conteneur, un élément de galerie, une
miniature ou un fichier sont conservés, et un fichier montré par une
galerie n'apparaît qu'une fois au starboard.
/birthday set et /birthday show partagent une même fiche encadrée : date et
salon d'annonce avec le bouton à côté, jumeaux, puis en petit les données
conservées. /birthday upcoming répond aussi dans un conteneur, ce qui porte
la limite de texte à 4 000 caractères.
@AntoineJT
AntoineJT force-pushed the feat/birthday-own-sheet branch from e840b3b to 47cc0df Compare November 10, 2026 04:04
@AntoineJT
AntoineJT merged commit da8ccc7 into master Nov 10, 2026
17 checks passed
@AntoineJT
AntoineJT deleted the feat/birthday-own-sheet branch November 10, 2026 04:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

scope: enhancement Enhance an existing feature type: module Add a new module or edit an existing one

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant